/*****************************************************************************************
 * 文件名   ：main.c
 * 描述     ：项目名称中不允许有空格字符，如要分割用下划线    
 * 编译器   ：KEIL_C51_V5.14.2
 * 版本     ：V1.0.0
 * 作者     ：夏毅承
 * 修改时间 ：2016-02-01
 *
 * 说明     ：程序中变量及定义等的一些命名规定：
 *
 *            宏定义:         全部为大写字母，  示例：  #define   NOP()     _asm("nop");
 *            IO口的位定义：  全部为大写字母且已 _Bit结尾，
 *                                              示例：  _Bool     RELAY_Bit     @PA_ODR:2;
 *
 *            布尔变量: 全部已Flag结尾，             示例： _Bool     PascalCaseFlag;
 *            变量定义1: 局部变量全小写，全局变量采用PascalCase，
 *                                                   示例：局部变量
 *                                                          unsigned char   pascal_case;  
 *                                                         全局变量
 *                                                          unsigned char   PascalCase;
 *						变量定义2：局部变量前加小写的变量类型标识，全局变量前加大写的变量类型标识，
 *											 并以下划线与变量名分割开，
 *																										实例：局部变量
 *																													unsigned char   u8_pascal_case;
 *																										全局变量
 *                                                          unsigned char   U8_PascalCase;
 *            函数名：采用PascalCase方式，            示例：void FunctionName(void);
 *                                                          
 *            
 * 书写规范：
 * 
 *  一个TAB设定为2个字符，否则会出现对齐错乱现象。
 *
 *  每个函数定义结束之后都要加空行。
 *
 *  在一个函数体内，逻揖上密切相关的语句之间不加空行，其它地方应加空行分隔。
 *
 *  关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少要留一个空格，
 *  否则无法辨析关键字。象if、for、while 等关键字之后应留一个空格再跟左括号‘（’，以突出关键字。
 *
 *  函数名之后不要留空格，紧跟左括号‘（’，以与关键字区别。
 *
 *  ‘（’向后紧跟，‘）’、‘，’、‘;’向前紧跟，紧跟处不留空格。
 *
 *  ‘，’之后要留空格，如Function(x, y, z)。如果‘;’不是一行的结束符号，其后要留空格，
 *  如for (initialization; condition; update)。
 *
 *  赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符，如“=”、“+=” “>=”、“<=”、
 *  “+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。
 *
 *  一元操作符如“!”、“~”、“++”、“--”、“&”（地址运算符）等前后不加空格。
 *
 *  象“［］”、“.”、“->”这类操作符前后不加空格。
 *
 *  对于表达式比较长的for 语句和if 语句，为了紧凑起见可以适当地去掉一些空格，
 *  如for (i=0; i<10; i++)和if ((a<=b) && (c<=d))
 *
 * 指针修饰符 * 和＆ 紧靠变量名，例如 int *x, y; // 此处y 不会被误解为指针。
 *
 ****************************************************************************************/

/*
  注意事项：
	代码选项：
		OP_WDT--------------->Disable WDT function
		OP_WDTPD------------->Disable WDT function in the Power-Down mode
		OP_RST--------------->Pin P4. used as I/O pin
		OP_WMT--------------->longest warm up time
		OP_OSC--------------->Internal RC oscillator (16.6MHz)
		OP_LVREN------------->Enable LVR function
		OP_LVRLE------------->2.8V LVR Level 3
		OP_SCM--------------->SCM is invalid in warm up period
		OP_IO---------------->IO is Input Only mode when reset occurs
		OP_OSCDRV------------>Maximum
		OP_P3---------------->P3 sink abilit normal mode
		OP_P1P4-------------->P1/P4 dirver ability normal mode
  
*/
/* Includes ------------------------------------------------------------------*/                                     
/*
		分时操作原理：（以2毫秒分时操作为例其余相同）
		1mS时基（执行缺相检测），2mS时基（执行助力端口状态检测和Uart通讯以及电机堵转侦测与防
		盗锁电机）为防止执行功能太多造成时间阻塞，所以要将上述几个功能在2毫秒时基中分割，同时
		要保证每个功能执行的时间间隔都是2毫秒，分割图如下，
				1mS			1mS				1mS			1mS				1mS			1mS
		|--------|--------|--------|--------|--------|--------| 1mS时基
		|--------|********|--------|********|--------|********| 2mS时基的前1毫秒，助力端口状态检测和Uart通讯，*号时间段不执行本部程序
		|********|--------|********|--------|********|--------|	2mS时基的后1毫秒，机堵转侦测与防盗锁电机，*号时间段不执行本部程序
*/
//****************************************************************************

#include "..\Inc\includes.h"

/**************************************************************************
 * 函数名		：InitSys()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2018-09-30
 * 函数描述 ：主函数
 *************************************************************************/ 
void main(void)
{
	static unsigned char							u8_2ms_opearation = 0,
																		u8_5ms_opearation = 0,
																		u8_10ms_opearation = 0,
																		u8_100ms_opearation = 0;
																		//u8_200ms_opearation = 0;

	InitSys();

	while (TRUE)
	{
		if (Timer_1mS_CycleFlag)																															//1mS时间到
		{
/****************************************************************************************/
//1毫秒时基操作控制		
			Timer_1mS_CycleFlag = FALSE;
			
			
			if (ACC_POWER_Bit)																																	//给控制器送电后才可以发送数据
				UartSendDataFrame(U8_UartSendData);																								//发送Uart数据	
					
/****************************************************************************************/
//2毫秒时基操作控制					
			if ((++u8_2ms_opearation)>1)																												//两毫秒时基的后1毫秒
			{
				u8_2ms_opearation = 0;
				UartReceiveDataBlockCheck();																											//数据校验	
			}
			else if (u8_2ms_opearation==1)																											//两毫秒时基的前1毫秒
			{
				
			}

/****************************************************************************************/
//5毫秒时基操作控制	

			if ((++u8_5ms_opearation)>4)																												//5毫秒时基的最后1毫秒
			{
				u8_5ms_opearation = 0;
				ButtonCheckOperation();
			}
			else if (u8_5ms_opearation==1)																											//5毫秒时基的前1毫秒
			{
				PowerButtonOperation();
			}
			else if (u8_5ms_opearation==2)
			{
				UpButtonOperation();
			}
			else if (u8_5ms_opearation==3)
			{
				DownButtonOperation();
			}
			else if (u8_5ms_opearation==4)																											//
			{
				UpAndDownButtonOperation();																												//
			}
			
/****************************************************************************************/		
//10毫秒时基操作控制	
			if ((++u8_10ms_opearation)>9)																												//10毫秒时基的最后1毫秒
			{
				u8_10ms_opearation = 0;
				
				ADC_ChannelChange();																															//ADC转换通道
			}
			else if (u8_10ms_opearation ==1)
			{
				if (FunctionSetSaveFlag)																													//重新保存参数
				{
					FunctionSetSaveFlag = FALSE;
					SSP_WriteMultiByte(ADDR_EXCURSION_PARAMETER, U8_UartSendData);									//重新保存参数
				}
			}
			else if (u8_10ms_opearation ==2)
			{
				HandleBarVoltageCalculate(U16_HandelbarVoltage);																	//转把操作
			}
			else if (u8_10ms_opearation ==3)
			{
			
			}
			else if (u8_10ms_opearation ==4)
			{
			
			}
			else if (u8_10ms_opearation ==5)
			{
				
			}
			else if (u8_10ms_opearation ==6)
			{
				//UartReceiveDataProcess();																											//接收Uart数据
			}
			else if (u8_10ms_opearation ==7)
			{
				//Average_Voltage_Control();																										//系统电压检测
			}
			else if (u8_10ms_opearation ==8)
			{
				

			}	

/****************************************************************************************/
//100毫秒时基操作控制	
			if ((++u8_100ms_opearation)>99)																											//100毫秒时基的最后1毫秒					
			{
				u8_100ms_opearation = 0;				
//----------------------------------------------------------------------------------------//
//串口接收超时操作			
				if (U8_UartReceiveTimeOverCount<CONNECT_TIME_OVER)																//
				{
					U8_UartReceiveTimeOverCount++;
				}
				else																																							//超过规定时间没有接收到数据
				{
					ControllerConnectFailFlag = TRUE;																								//通讯故障，不能接受到控制器数据	
					U8_UartReceiveCount = 0x00;																											//接收计数器清零				
				}
//----------------------------------------------------------------------------------------//				
			}
			else if (u8_100ms_opearation==1)
			{
				HT1621_RefreshScreenDisplay(LCD_RAM_Buffer.U8_LCD_DisplayBuffer);									//显示刷新
			}
			else if (u8_100ms_opearation==2)
			{
				LCD_SetDisplayData();																															//设置显示数据
			}	
			else if (u8_100ms_opearation==3)
			{				
				ParameterSendSet();																																//发送参数设置		
			}
			else if (u8_100ms_opearation==4)
			{
				SleepOperation();																																	//休眠
			}
			else if (u8_100ms_opearation==5)
			{
				SpeedPerHourCalculate(U16_WheelDiameterValue,	U8_UartReceiveData);								//时速
			}
/****************************************************************************************/			
		}
	}
}

/**********************SINOWEALTH_SH79F083A**********END OF FILE*************************/
